package xin.clips.system.service.impl;

import java.util.ArrayList;
import java.util.List;

import cn.hutool.core.util.ObjectUtil;
import xin.clips.common.constant.UserConstants;
import xin.clips.common.core.domain.Ztree;
import xin.clips.common.core.domain.entity.SysDept;
import xin.clips.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import xin.clips.common.core.text.Convert;
import xin.clips.common.utils.StringUtils;
import xin.clips.system.domain.gy.GyKnowBaseType;
import xin.clips.system.mapper.gy.GyKnowBaseTypeMapper;
import xin.clips.system.service.gy.IGyKnowBaseTypeService;


/**
 * 知识库类型Service业务层处理
 *
 * @author yuanzy
 * @date 2023-02-28
 */
@Service
public class GyKnowBaseTypeServiceImpl implements IGyKnowBaseTypeService {
    @Autowired
    private GyKnowBaseTypeMapper gyKnowBaseTypeMapper;

    /**
     * 查询知识库类型
     *
     * @param id 知识库类型主键
     * @return 知识库类型
     */
    @Override
    public GyKnowBaseType selectGyKnowBaseTypeById(Long id) {
        return gyKnowBaseTypeMapper.selectGyKnowBaseTypeById(id);
    }

    /**
     * 查询知识库类型列表
     *
     * @param gyKnowBaseType 知识库类型
     * @return 知识库类型
     */
    @Override
    public List<GyKnowBaseType> selectGyKnowBaseTypeList(GyKnowBaseType gyKnowBaseType) {
        return gyKnowBaseTypeMapper.selectGyKnowBaseTypeList(gyKnowBaseType);
    }

    /**
     * 新增知识库类型
     *
     * @param gyKnowBaseType 知识库类型
     * @return 结果
     */
    @Override
    public int insertGyKnowBaseType(GyKnowBaseType gyKnowBaseType) {
        GyKnowBaseType parent = gyKnowBaseTypeMapper.selectGyKnowBaseTypeById(gyKnowBaseType.getParentId());
        gyKnowBaseType.setCreateTime(DateUtils.getNowDate());
        gyKnowBaseType.setAncestors(parent.getAncestors() + "," + gyKnowBaseType.getParentId());
        return gyKnowBaseTypeMapper.insertGyKnowBaseType(gyKnowBaseType);
    }

    /**
     * 修改知识库类型
     *
     * @param gyKnowBaseType 知识库类型
     * @return 结果
     */
    @Override
    public int updateGyKnowBaseType(GyKnowBaseType gyKnowBaseType) {
        GyKnowBaseType newParentKnowBaseType = gyKnowBaseTypeMapper.
                selectGyKnowBaseTypeById(gyKnowBaseType.getParentId());
        GyKnowBaseType oldknowBaseType = gyKnowBaseTypeMapper.
                selectGyKnowBaseTypeById(gyKnowBaseType.getId());
        if (ObjectUtil.isNotNull(newParentKnowBaseType) && ObjectUtil.isNotNull(oldknowBaseType))
        {
            String newAncestors = newParentKnowBaseType.getAncestors() + "," + newParentKnowBaseType.getId();
            String oldAncestors = oldknowBaseType.getAncestors();
            gyKnowBaseType.setAncestors(newAncestors);
            updateDeptChildren(gyKnowBaseType.getId(), newAncestors, oldAncestors);
        }
        gyKnowBaseType.setUpdateTime(DateUtils.getNowDate());
        return gyKnowBaseTypeMapper.updateGyKnowBaseType(gyKnowBaseType);
    }

    /**
     * 修改子元素关系
     *
     * @param id 被修改的知识库类型id
     * @param newAncestors 新的父ID集合
     * @param oldAncestors 旧的父ID集合
     */
    public void updateDeptChildren(Long id, String newAncestors, String oldAncestors)
    {
        List<GyKnowBaseType> children = gyKnowBaseTypeMapper.selectChildrenKnowTypeById(id);
        for (GyKnowBaseType child : children)
        {
            child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
        }
        if (children.size() > 0)
        {
            gyKnowBaseTypeMapper.updateKnowTypeChildren(children);
        }
    }
    /**
     * 批量删除知识库类型
     *
     * @param ids 需要删除的知识库类型主键
     * @return 结果
     */
    @Override
    public int deleteGyKnowBaseTypeByIds(String ids) {
        return gyKnowBaseTypeMapper.deleteGyKnowBaseTypeByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除知识库类型信息
     *
     * @param id 知识库类型主键
     * @return 结果
     */
    @Override
    public int deleteGyKnowBaseTypeById(Long id) {
        return gyKnowBaseTypeMapper.deleteGyKnowBaseTypeById(id);
    }

    public List<Ztree> selectKnowTypeTreeExcludeChild(GyKnowBaseType knowBaseType) {
        Long excludeId = knowBaseType.getExcludeId();
        List<GyKnowBaseType> knowBaseTypes = gyKnowBaseTypeMapper.selectGyKnowBaseTypeList(knowBaseType);
        List<Ztree> ztrees = initZtree(knowBaseTypes);
        return ztrees;
    }

    /**
     * 对象转知识库类型树
     *
     * @param knowBaseTypes 知识库类型列表
     * @return 树结构列表
     */
    public List<Ztree> initZtree(List<GyKnowBaseType> knowBaseTypes) {
        List<Ztree> ztrees = new ArrayList<Ztree>();
        for (GyKnowBaseType knowBaseType : knowBaseTypes) {

            Ztree ztree = new Ztree();
            ztree.setId(knowBaseType.getId());
            ztree.setpId(knowBaseType.getParentId());
            ztree.setName(knowBaseType.getKnowTypeName());
            ztree.setTitle(knowBaseType.getKnowTypeName());

            ztrees.add(ztree);
        }

        return ztrees;
    }

    public boolean checkKnowBaseTypeUnique(GyKnowBaseType knowBaseType) {
        Long id = StringUtils.isNull(knowBaseType.getId()) ? -1L : knowBaseType.getId();

        GyKnowBaseType knowBaseType1 = new GyKnowBaseType();
        knowBaseType1.setKnowTypeName( knowBaseType.getKnowTypeName());
        knowBaseType1.setParentId(knowBaseType.getParentId());
        GyKnowBaseType info = gyKnowBaseTypeMapper.
                checkKnowBaseTypeUnique(knowBaseType1);
        if (ObjectUtil.isNotEmpty(info) && info.getId().longValue() != id) {
            return false;
        }
        return true;
    }


    /**
     * 查询知识库类型树
     *
     * @param knowBaseType
     * @return
     */
    public List<Ztree> selectKnowTypeTree(GyKnowBaseType knowBaseType) {
        List<GyKnowBaseType> knowBaseTypes = gyKnowBaseTypeMapper.selectGyKnowBaseTypeList(knowBaseType);
        List<Ztree> ztrees = new ArrayList<Ztree>();

        for (GyKnowBaseType info : knowBaseTypes) {
            Ztree ztree = new Ztree();
            ztree.setId(info.getId());
            ztree.setpId(info.getParentId());
            ztree.setName(info.getKnowTypeName());
            ztree.setTitle(info.getKnowTypeName());
            ztrees.add(ztree);
        }
        return ztrees;
    }

}
